package com.holiday.spring.aop;

import jdk.nashorn.internal.runtime.regexp.JoniRegExp;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 使用注解AOP
 *      1、自定义类，告诉spring，这个是一个切面类，里面定义切入点和通知
 *      2、自定义类添加注解：@Component、@Aspect
 *      3、再自定义一个类添加注解即可，不用写代码
 *          1、@Configuration：告诉spring这是一个配置类
 *          2、@ComponentScan("com.holiday")：开启扫描
 *          3、@EnableAspectJAutoProxy：开启spring对aspect的对象
 *      4、使用
 *           1、AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnotationAppConfig.class);
 *           2、VideoService video = (VideoService) context.getBean("videoServiceImpl"); 这个里面写的是实现类
 *           3、video.findById(1);
 */
@Component
@Aspect
public class LogAdvice {

    //定义切入点，即在什么方法中做事情
    @Pointcut("execution(* com.holiday.spring.service.impl.VideoServiceImpl.*(..))")
    public void asspect(){
        // 这里面不用写代码
    }
    // 定义通知，即要干什么事情，可以定义很多
    @Before("asspect()")
    public  void beforLog(JoinPoint joinPoint){
        System.out.println("LogAdvice beforlog ");
    }
    // 定义通知，即要干什么事情，可以定义很多
    @After("asspect()")
    public  void afterLog(JoinPoint joinPoint){
        System.out.println("LogAdvice afterLog ");
    }

    // 定义环绕通知
    @Around("asspect()")
    public  void around(JoinPoint joinPoint) throws Throwable {

        long start=System.currentTimeMillis();
        System.out.println("环绕前.....");
        // 获取调用者的
        System.out.println(joinPoint.getTarget().getClass().getName());
        // 获取入参
        System.out.println(joinPoint.getArgs());
        //获取调用的方法
        System.out.println(joinPoint.getSignature().getName());
        // 执行目标的方法
        ((ProceedingJoinPoint)joinPoint).proceed();
        long end=System.currentTimeMillis();
        System.out.println("环绕后.....");
    }

}
